package cn.bonoon.kernel.annotations;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * <pre>
 * 使用情况说明：
 * 生成MD5码，前提条件是该字段对象数据库实体的字段必须为字符串(String)类型，否则该注解是无效的；
 * 如果使用随机({@link MD5Type#RANDOM})模式，表示不管界面实体是什么值都不会被使用，直接生成一个随机的md5码；
 * 这种模式修改的时候将不允许重新赋值
 * 如果使用其它的模式，则表示会把界面的实体使用md5进行加密，一般使用的情况是用于存储一些简单的密码，如某些申请业务提供
 * 的通过申请单号和密码查询来查看申请状态等。指定可以有两种情况： 
 * 1. 只允许创建一次 {@link MD5Type#INIT}模式
 * 2. 可以随时修改 {@link MD5Type#BOTH}模式
 *      这种模式下，修改的时候可能会把原来的值传回去保存，但如果值与数据库所保存的值相同的，则不再重新生成md5和赋值
 * 
 * 普通实体的字段可以是任意类型（包括基本数据类型），其它类型都会转成相应的String值再进行MD5的计算值
 * </pre>
 * @author jackson
 *
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface MD5Builder {
	MD5Type value() default MD5Type.RANDOM;
	public enum MD5Type{
		//random
		/**
		 * 随机生成的模式，这种模式只允许在添加的时候随机生成md5码，修改的时候不允许再修改
		 */
		RANDOM, 
		/**
		 * 只允许创建一次
		 */
		INIT, 
		/**
		 * 随时允许修改
		 */
		BOTH
	}
}
